package org.dromara.ai.provider;

import org.dromara.ai.domain.dto.AiChatRequest;
import org.dromara.ai.domain.dto.AiChatResponse;
import org.dromara.ai.domain.dto.AiModelInfo;
import org.dromara.ai.domain.enums.AiProviderType;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * AI服务提供商接口
 * 定义统一的AI服务接口规范，支持多种AI服务提供商
 *
 * @author RuoYi
 * @since 2024-01-01
 */
public interface AiProvider {

    /**
     * 获取提供商类型
     *
     * @return 提供商类型
     */
    AiProviderType getProviderType();

    /**
     * 获取提供商名称
     *
     * @return 提供商名称
     */
    String getProviderName();

    /**
     * 获取提供商版本
     *
     * @return 版本信息
     */
    String getVersion();

    /**
     * 检查提供商是否可用
     *
     * @return 是否可用
     */
    boolean isAvailable();

    /**
     * 初始化提供商
     *
     * @param config 配置参数
     */
    void initialize(Map<String, Object> config);

    /**
     * 销毁提供商资源
     */
    void destroy();

    /**
     * 同步聊天对话
     *
     * @param request 聊天请求
     * @return 聊天响应
     */
    AiChatResponse chat(AiChatRequest request);

    /**
     * 异步聊天对话
     *
     * @param request 聊天请求
     * @return 异步聊天响应
     */
    CompletableFuture<AiChatResponse> chatAsync(AiChatRequest request);

    /**
     * 流式聊天对话
     *
     * @param request 聊天请求
     * @param callback 流式回调
     */
    void chatStream(AiChatRequest request, StreamCallback callback);

    /**
     * 获取支持的模型列表
     *
     * @return 模型列表
     */
    List<AiModelInfo> getSupportedModels();

    /**
     * 检查模型是否支持
     *
     * @param modelName 模型名称
     * @return 是否支持
     */
    boolean isModelSupported(String modelName);

    /**
     * 获取模型信息
     *
     * @param modelName 模型名称
     * @return 模型信息
     */
    AiModelInfo getModelInfo(String modelName);

    /**
     * 获取提供商配置
     *
     * @return 配置信息
     */
    Map<String, Object> getConfiguration();

    /**
     * 更新提供商配置
     *
     * @param config 新配置
     */
    void updateConfiguration(Map<String, Object> config);

    /**
     * 获取提供商统计信息
     *
     * @return 统计信息
     */
    Map<String, Object> getStatistics();

    /**
     * 重置统计信息
     */
    void resetStatistics();

    /**
     * 流式回调接口
     */
    interface StreamCallback {
        /**
         * 接收流式数据
         *
         * @param chunk 数据块
         */
        void onChunk(String chunk);

        /**
         * 流式完成
         *
         * @param response 完整响应
         */
        void onComplete(AiChatResponse response);

        /**
         * 流式错误
         *
         * @param error 错误信息
         */
        void onError(Throwable error);
    }
}